// 判断
// 1. 是否是子序列 (greedy，slow 与短串长度是否一致)
// 3. 最长连续序列（不连续结果连续）（map，先找到没有前一个的起点，再while找到终止位置）
// 4. 最长连续递增子序列（其实是子串）（连续结果不连续）（greedy，对比前一位）
// 5. 最长递增子序列（不连续结果也不连续）（dp， 对比的是之前的> nums[j], 结果为dp[j]+1）
// 6. 最长公共子序列 (dp，形成表格，相等则左上+1，不等则左，上取最大)
// 7. 最长公共子串（多个）（dp 形成表格，相等则左上+1，不等则为9 ，顺带计算结果）

// 不重复
// 2. 最长无重复子串（连续）（map, cover 当出现相同，则left更新为map 存的位置）
// 区间划分字符串（重复的在一个区间）

// 前缀和
// 8. 和为k的子串（连续）（map-前缀和） 和为k的子序列
// 除自身外的乘积

// dp
// 9. 最大子串和 （greedy - 判断递增循环）
// 分割等和子集
// 零钱兑换

// 回文 
// 1. 是否是回文（array-两边夹逼）
// 2. 最长回文长度（乱序）（map 存在+2）
// 3. 最长回文子串（连续 array中心扩散）
// 4. 最长回文子序列（不连续，但有先后 dp 二维倒序，相等 右上+2， 不相等取 上右 ）【TODO】
// 5. 回文的回文子串 （数目 dp）【TODO】
// 6. 是否是回文链表（link -转换为数组）
// 7. 插入n个变回文串


// 1. 两数之和（map）
// 4. 组合之和1，
// 5. 组合之和2，
// 6. 组合之和3（backtracing）【TODO】


// 5. 最小栈-155-最小栈
// 6. 单调栈-496-下一个更大元素
// 7. 单调栈-503-下一个更大元素2 （存索引）
// 8. 单调栈-739-每日温度 
// 9. 单调栈-42-接雨水 （宽度i-left-1， 高度 左右最大）
// 10. 单调栈-84-柱状图中最大矩形（宽度i-left-1， 高度 top）



// 11. 滑动窗口-209-长度最小的子数组 (快慢追赶，达到目标左边移动，不足右边移动)
// 12. 滑动窗口-239-滑动窗口最大值（待理解-困难）双端队列存索引
// 13. 和-15-三数之和（待理解-中等）确定一个，两边夹逼 要注意去重复
// 14. 和-18-四数之和（待理解-中等） 确定两个，两边夹逼 要注意去重复
// 最小覆盖子串/所有的字母异位词


// 15. 11-盛最多水的容器 左右两边夹逼，取最大

// 旋转数组最小值
// 排序数组第一个和最后一个
// 旋转数组的目标值


var groupAnagrams = function(strs) {
    let map = {}
    for(let i =0; i< strs.length; i++){
        let key = strs[i].split('').sort().join('');
        console.log(key, "key")
        if(map[key] !== undefined){
            let temp = map[key] || [];
            temp.push(strs[i])
            console.log(temp)
            map[key] = temp
        } else {
            map[key]= [strs[i]]
        }
    }

    return Object.values(map)

};

console.log(groupAnagrams(["eat","tea","tan","ate","nat","bat"]))